PICから始めよう、遊ぼう、楽しもう、PICキットの構築
XC8による基本プログラム
PIC16F1705/09編
PICキットXC8基本プログラム
当局で実験等で使用したXC8プログラムの最低限のメインソースです。
毎度々記述が必要かつほぼ同じな初期設定類です。
これをリネームして目的のメインソースに仕上げていきます。
ソースファイルや記載分を変更する場合がありますので、最終更新日を確認して下さい
16F18326と16F1705はメモリ容量が8KWと16KWとで倍も違います。
XC8で整数を扱ったプログラミングするには両PICとも問題無いのですが、printf()と演算で浮動小数点を扱うと16F1705ではメモリ不足でコンパイルできない事があります。
もしかして、有料版だと最適化で大丈夫かも知れませんが・・・
XC8で気ままにプログラミングするには16KWの16F18326等が向いていると思われます。
参考文献
MPLAB_XIDE ユーザーズガイド日本語版 (DS50002027D_JP)
MPLAB_XC8 入門ガイド日本語版 (DS50002173A_JP)
最終更新日 2019年12月15日
当局で実験等で使用したXC8プログラムの最低限のメインソースです。
毎度々記述が必要かつほぼ同じな初期設定類です。
これをリネームして目的のメインソースに仕上げていきます。
ソースファイルや記載分を変更する場合がありますので、最終更新日を確認して下さい
16F18326と16F1705はメモリ容量が8KWと16KWとで倍も違います。
XC8で整数を扱ったプログラミングするには両PICとも問題無いのですが、printf()と演算で浮動小数点を扱うと16F1705ではメモリ不足でコンパイルできない事があります。
もしかして、有料版だと最適化で大丈夫かも知れませんが・・・
XC8で気ままにプログラミングするには16KWの16F18326等が向いていると思われます。
参考文献
MPLAB_XIDE ユーザーズガイド日本語版 (DS50002027D_JP)
MPLAB_XC8 入門ガイド日本語版 (DS50002173A_JP)
最終更新日 2019年12月15日
見た目はほとんど変わらないので、画像はPIC16F18326版を使い回しています
↑ NO-14 LCDモジュール
AQM1602と互換性のある、
I2C接続16桁2行LCD
基本プログラム その1
メインソースファイル
XC8_16F1705BASIC_AQM01.c
インクルード ファイル
MSSP02b.h
MSSP02b.c
AQM1602v2.h
AQM1602v2.c
↑ NO-14 LCDモジュール
AQM1602と互換性のある、
I2C接続16桁2行LCD
基本プログラム その1
メインソースファイル
XC8_16F1705BASIC_AQM01.c
インクルード ファイル
MSSP02b.h
MSSP02b.c
AQM1602v2.h
AQM1602v2.c
PICキットXC8基本プログラム その1
16桁2行のLCDを標準ディスプレイとした場合
LCDはI2Cインターフェイスで接続するタイプを使用します。
AQM1602あるいは互換品を対象としています。
使用PICキットモジュール(基板)
NO-01 14ピンCPU基板(PIC16F18326を装着)
NO-12 I2C接続LCD表示器、あるいはNO-14LCD表示器
以上の2種のモジュールを使用します
もちろん、5V電源や配線コード類も必要です。
PICキットCPUモジュールとLCDとの接続
LCDへはI2Cバス線が2本、電源線が2本、計4本の接続線が必要です
※電源線のプラスマイナスは間違わないように注意して下さい
CPU基板側 LCD側
RC0 SCL線
RC1 SDA線
基本プログラム その1
左記のソースファイルを参照して下さい
16F1705と16F1709は、RC6-RC7、RB5-RB7の6ピンが増えています。
I/O初期設定時がその分少々違いますが、コンフィグレーション設定は同じです。
その他、内蔵モジュールとI/Oピンとの設定が違う場合もあります。
最低限の記述しかありませんが、これに必要な計算やI/Oアクセス関数等を追加記述し、LCDに表示すればPICプログラミング完成、と言う寸法です。
ソースファイルのコメント文もご参照下さい。
16桁2行のLCDを標準ディスプレイとした場合
LCDはI2Cインターフェイスで接続するタイプを使用します。
AQM1602あるいは互換品を対象としています。
使用PICキットモジュール(基板)
NO-01 14ピンCPU基板(PIC16F18326を装着)
NO-12 I2C接続LCD表示器、あるいはNO-14LCD表示器
以上の2種のモジュールを使用します
もちろん、5V電源や配線コード類も必要です。
PICキットCPUモジュールとLCDとの接続
LCDへはI2Cバス線が2本、電源線が2本、計4本の接続線が必要です
※電源線のプラスマイナスは間違わないように注意して下さい
CPU基板側 LCD側
RC0 SCL線
RC1 SDA線
基本プログラム その1
左記のソースファイルを参照して下さい
16F1705と16F1709は、RC6-RC7、RB5-RB7の6ピンが増えています。
I/O初期設定時がその分少々違いますが、コンフィグレーション設定は同じです。
その他、内蔵モジュールとI/Oピンとの設定が違う場合もあります。
最低限の記述しかありませんが、これに必要な計算やI/Oアクセス関数等を追加記述し、LCDに表示すればPICプログラミング完成、と言う寸法です。
ソースファイルのコメント文もご参照下さい。
画像はPIC16F18326版を使い回しています
↑ 14ピンCPU基板
↑ 8桁7セグLEDモジュール
SPI接続の7セグLED
基本プログラム
XC8_16F1705BASIC_DFR01.c
インクルードファイル
DFR0090v2b.h
DFR0090v2b.c
↑ 14ピンCPU基板
↑ 8桁7セグLEDモジュール
SPI接続の7セグLED
基本プログラム
XC8_16F1705BASIC_DFR01.c
インクルードファイル
DFR0090v2b.h
DFR0090v2b.c
PICキットXC8基本プログラム その2
8桁7セグLEDを標準ディスプレイとした場合
これはSPIで接続するタイプで、HC595を介してLEDと接続された構造となっています。
DFR0090あるいは互換品を対象としています。
今の所、制御LED数は8個までです。
制御可能LED桁数の拡張は可能ですが、必要性が出てきたら行いたいと思います。
MSSPは使用せず、データを受けませんので、送信しっぱなしです。
使用ポートが違うので、I2Cバスと共存できます。
また、送信のみなので、SPIポートとICSPポートと併用可能です。
LCDと違い、文字も大きく自ら発光するので、とても見易いです。
また、高速で動作するので、8bitPICでは理論的にはウエイト不要です。
使用PICキットモジュール(基板)
NO-01 14ピンCPU基板(PIC16F1705を装着)
DFR00908桁7セグLEDモジュール
以上の2種のモジュールを使用します
もちろん、5V電源や配線コード類も必要です。
PICキットCPUモジュールとLEDモジュールとの接続
LEDへはSPIバス線が3本、電源線が2本、計5本の接続線が必要です
※電源線のプラスマイナスは間違わないように注意して下さい
デフォルト設定(ヘッダーファイルで変更可)
CPU基板側 LED側
RA0 DATA線
RA1 LATCH線
RA2 CLOCK線
基本プログラム その1
7セグLED制御関数群(DFR0090v2)をご参照下さい
これの使用方法を把握して頂く必要があります
こう言う場合、インクルードしてソースを追加するのは、見ずらいですよね、
申し訳ありません。 <m(_ _)m>
printf()使用の注意点としては、
①printf文記述直前にLCD表示アドレスが最左側にセットされていること
②表示できる文字種に制限がある事
基本的に数字の使用を想定していますが、その他に少々の文字
③複雑な使い方をするとメモリを大量消費する事
④浮動小数点演算も絡めての表示は特にメモリ食いです。
無線周波数等の数字表示方法を使用する場合
(これら関数使用の途中にprintf関数の使用はできません)
基本的な使用方法
①32bit符号無し整数(16進バイナリ数値)を用意
↓
②BCD24関数(32bit16進数値を32bitBCDに変換)
↓
③SET_SBUF関数 (バッファに中間コード生成)
↓
④XFER_LED1関数
(中間コードから7セグLEDにセグメントデータ生成・転送)
使用する制御関数
SET_SBUF(unsigned long int 引数1,unsigned char 引数2)
32bitBCDから中間コードをバッファに生成します
引数1:32bit符号無し整数(32bitBCD)
引数2:8bitフラグバイト(注1)
戻値:広域バッファに中間コードを収納
XFER_LED1(void)
広域バッファの中間コードからセグメントデータを生成、
SPI接続7セグLEDに送信・表示します
引数:無
戻値:無
unsigned long int BCD24(unsigned long int 引数)
32bit16進バイナリ数値を40bitBCDに変換します
引数:32bit16進バイナリ数値(0H~FFFFFFFFH)
戻値:変換した40bitBCDの上位8bitを切り捨て、
32bitBCDで返す
注1)SET_SBUF関数・引数1のフラグバイト
表示制御フラグ「FLG」各ビット詳細
表示桁数指令
2桁表示指令 FLG=xxxxx001
4桁表示指令 FLG=xxxxx011
6桁表示指令 FLG=xxxxx101
8桁表示指令 FLG=xxxxx111
ゼロブランキング指令
しない FLG=xxxx0xxx
する FLG=xxxx1xxx
ドット表示指令
2,5桁点灯 FLG=x001xxxx
3,6桁点灯 FLG=x010xxxx
4,7桁点灯 FLG=x100xxxx
8桁7セグLEDを標準ディスプレイとした場合
これはSPIで接続するタイプで、HC595を介してLEDと接続された構造となっています。
DFR0090あるいは互換品を対象としています。
今の所、制御LED数は8個までです。
制御可能LED桁数の拡張は可能ですが、必要性が出てきたら行いたいと思います。
MSSPは使用せず、データを受けませんので、送信しっぱなしです。
使用ポートが違うので、I2Cバスと共存できます。
また、送信のみなので、SPIポートとICSPポートと併用可能です。
LCDと違い、文字も大きく自ら発光するので、とても見易いです。
また、高速で動作するので、8bitPICでは理論的にはウエイト不要です。
使用PICキットモジュール(基板)
NO-01 14ピンCPU基板(PIC16F1705を装着)
DFR00908桁7セグLEDモジュール
以上の2種のモジュールを使用します
もちろん、5V電源や配線コード類も必要です。
PICキットCPUモジュールとLEDモジュールとの接続
LEDへはSPIバス線が3本、電源線が2本、計5本の接続線が必要です
※電源線のプラスマイナスは間違わないように注意して下さい
デフォルト設定(ヘッダーファイルで変更可)
CPU基板側 LED側
RA0 DATA線
RA1 LATCH線
RA2 CLOCK線
基本プログラム その1
7セグLED制御関数群(DFR0090v2)をご参照下さい
これの使用方法を把握して頂く必要があります
こう言う場合、インクルードしてソースを追加するのは、見ずらいですよね、
申し訳ありません。 <m(_ _)m>
printf()使用の注意点としては、
①printf文記述直前にLCD表示アドレスが最左側にセットされていること
②表示できる文字種に制限がある事
基本的に数字の使用を想定していますが、その他に少々の文字
③複雑な使い方をするとメモリを大量消費する事
④浮動小数点演算も絡めての表示は特にメモリ食いです。
無線周波数等の数字表示方法を使用する場合
(これら関数使用の途中にprintf関数の使用はできません)
基本的な使用方法
①32bit符号無し整数(16進バイナリ数値)を用意
↓
②BCD24関数(32bit16進数値を32bitBCDに変換)
↓
③SET_SBUF関数 (バッファに中間コード生成)
↓
④XFER_LED1関数
(中間コードから7セグLEDにセグメントデータ生成・転送)
使用する制御関数
SET_SBUF(unsigned long int 引数1,unsigned char 引数2)
32bitBCDから中間コードをバッファに生成します
引数1:32bit符号無し整数(32bitBCD)
引数2:8bitフラグバイト(注1)
戻値:広域バッファに中間コードを収納
XFER_LED1(void)
広域バッファの中間コードからセグメントデータを生成、
SPI接続7セグLEDに送信・表示します
引数:無
戻値:無
unsigned long int BCD24(unsigned long int 引数)
32bit16進バイナリ数値を40bitBCDに変換します
引数:32bit16進バイナリ数値(0H~FFFFFFFFH)
戻値:変換した40bitBCDの上位8bitを切り捨て、
32bitBCDで返す
注1)SET_SBUF関数・引数1のフラグバイト
表示制御フラグ「FLG」各ビット詳細
表示桁数指令
2桁表示指令 FLG=xxxxx001
4桁表示指令 FLG=xxxxx011
6桁表示指令 FLG=xxxxx101
8桁表示指令 FLG=xxxxx111
ゼロブランキング指令
しない FLG=xxxx0xxx
する FLG=xxxx1xxx
ドット表示指令
2,5桁点灯 FLG=x001xxxx
3,6桁点灯 FLG=x010xxxx
4,7桁点灯 FLG=x100xxxx
画像はPIC16F18326版を使い回しています。
↑ ADC出力値表示
関数からの出力値(HEX)を表示
ボリウムを回すと、出力値は、
0000H~03FFHまで変化する
画像の場合、15AH=346なので、
入力電圧は約1689mVとなる
↑ ADC出力値表示
ボリウム最大なので5V入力
ADCを使用した簡単なメイン関数、
内部展開しているADC関数
16F18346でもそのまま使えます
PIC16F1705とLCD
XC8_16F1705BASIC_ADC01.c
このデモプログラムでは、
VREF+:VDD
VREF-:VSS
ADC入力:RC2
以上の設定にて行っています
↑ ADC出力値表示
関数からの出力値(HEX)を表示
ボリウムを回すと、出力値は、
0000H~03FFHまで変化する
画像の場合、15AH=346なので、
入力電圧は約1689mVとなる
↑ ADC出力値表示
ボリウム最大なので5V入力
ADCを使用した簡単なメイン関数、
内部展開しているADC関数
16F18346でもそのまま使えます
PIC16F1705とLCD
XC8_16F1705BASIC_ADC01.c
このデモプログラムでは、
VREF+:VDD
VREF-:VSS
ADC入力:RC2
以上の設定にて行っています
10ビットADC関数
内部関数としてメイン関数の後にコピペ展開します。
また、関数名のプロトタイピングも必要です。
アナログ入力ポート番号は実際のI/Oポート番号との関係はPICによって違いがありますが、16F1705/1709では共通です
I/Oポート設定は、アナログ入力とします(TRISbit=1,ANSELbit=1)
プログラムは汎用性を持たせるために回りくどい事をしています。
状況に合わせて固定値設定を行う事でプログラムはすっきりします。
ADC関数の使用方法
INIT_ADC(unsigned char 引数)
内蔵ADCの初期設定を行います
ADCクロック(TAD)はシステム変数を参照して最小値に設定します
引数からFVRも設定します。
自動変換トリガの設定は行いません
引数:電圧リファレンスの指定
0:VREF+=VDD、VREF-=VSS
1:VREF+=FVR1V、VREF-=VSS
2:VREF+=FVR2V、VREF-=VSS
3:VREF+=FVR4V、VREF-=VSS
4:VREF+=VREF+ピン、VREF-=VSS
5:VREF+=VREF+ピン、VREF-=VREF-ピン
戻値:無し
unsigned int GET_ADC(引数)
内蔵10ビットADCを起動・相対電圧値を取得します
事前にINIT_ADC()関数を実行しておく必要があります。
取得した電圧値は符号無し16bitで返しますが、下位10bitが有効
リファレンス電圧値の1/1024が分解能となります
引数:アナログ入力チャンネル番号(注1)
戻値:符号無16bit整数 0000H~03FFH
注1)PIC16F1705アナログチャンネル番号とI/Oポート
PIC16F18326とは違いがあるので注意!
チャンネル番号 アナログポート番号 I/Oポート
00: AN0: RA0
01: AN1: RA1
02: AN2: RA2
03: AN3: RA4
04: AN4: RC0
05: AN5: RC1
06: AN6: RC2
07: AN7: RC3
08: AN8: RC6(注2)
09: AN9: RC7(注2)
10: AN10: RB4(注2)
11: AN11: RB5(注2)
これ以上のチャンネルは各種内蔵モジュールとの接続になります。
注2)
PIC16F1709のみ
内部関数としてメイン関数の後にコピペ展開します。
また、関数名のプロトタイピングも必要です。
アナログ入力ポート番号は実際のI/Oポート番号との関係はPICによって違いがありますが、16F1705/1709では共通です
I/Oポート設定は、アナログ入力とします(TRISbit=1,ANSELbit=1)
プログラムは汎用性を持たせるために回りくどい事をしています。
状況に合わせて固定値設定を行う事でプログラムはすっきりします。
ADC関数の使用方法
INIT_ADC(unsigned char 引数)
内蔵ADCの初期設定を行います
ADCクロック(TAD)はシステム変数を参照して最小値に設定します
引数からFVRも設定します。
自動変換トリガの設定は行いません
引数:電圧リファレンスの指定
0:VREF+=VDD、VREF-=VSS
1:VREF+=FVR1V、VREF-=VSS
2:VREF+=FVR2V、VREF-=VSS
3:VREF+=FVR4V、VREF-=VSS
4:VREF+=VREF+ピン、VREF-=VSS
5:VREF+=VREF+ピン、VREF-=VREF-ピン
戻値:無し
unsigned int GET_ADC(引数)
内蔵10ビットADCを起動・相対電圧値を取得します
事前にINIT_ADC()関数を実行しておく必要があります。
取得した電圧値は符号無し16bitで返しますが、下位10bitが有効
リファレンス電圧値の1/1024が分解能となります
引数:アナログ入力チャンネル番号(注1)
戻値:符号無16bit整数 0000H~03FFH
注1)PIC16F1705アナログチャンネル番号とI/Oポート
PIC16F18326とは違いがあるので注意!
チャンネル番号 アナログポート番号 I/Oポート
00: AN0: RA0
01: AN1: RA1
02: AN2: RA2
03: AN3: RA4
04: AN4: RC0
05: AN5: RC1
06: AN6: RC2
07: AN7: RC3
08: AN8: RC6(注2)
09: AN9: RC7(注2)
10: AN10: RB4(注2)
11: AN11: RB5(注2)
これ以上のチャンネルは各種内蔵モジュールとの接続になります。
注2)
PIC16F1709のみ